package com.bsfcs.rag.controller;

import com.bsfcs.rag.entity.Project;
import com.bsfcs.rag.service.ContractProjectAnalysisService;
import com.bsfcs.rag.service.ProjectDTO;
import com.fasterxml.jackson.core.JsonProcessingException;
import org.springframework.web.bind.annotation.*;

import reactor.core.publisher.Flux;

@RestController
@RequestMapping("/contract-project")
public class ContractProjectController {

    private final ContractProjectAnalysisService contractProjectAnalysisService;

    ContractProjectController(ContractProjectAnalysisService contractProjectAnalysisService) {
        this.contractProjectAnalysisService = contractProjectAnalysisService;
    }

    /**
     * 根据项目ID分析合同执行情况
     * @param projectId 项目ID
     * @return 合同执行情况分析结果
     * @throws JsonProcessingException JSON处理异常
     */
    @GetMapping("/analysis")
    public Flux<String> contractProjectAnalysis(@RequestParam("projectId") String projectId) throws JsonProcessingException {
        return contractProjectAnalysisService.getProjectContractAnalysis(projectId);
    }
    
    /**
     * 根据项目对象分析合同执行情况
     * @param projectDTO 项目对象
     * @return 合同执行情况分析结果
     * @throws JsonProcessingException JSON处理异常
     */
    @PostMapping("/analysis-by-object")
    public Flux<String> contractProjectAnalysisByObject(@RequestBody ProjectDTO projectDTO) throws JsonProcessingException {
        return contractProjectAnalysisService.getProjectContractAnalysis(projectDTO);
    }
    
    /**
     * 根据项目对象分析合同执行情况（以项目作为最外层结构）
     * @param project 项目对象
     * @return 合同执行情况分析结果
     * @throws JsonProcessingException JSON处理异常
     */
    @PostMapping("/analysis-with-project-as-root")
    public Flux<String> contractProjectAnalysisWithProjectAsRoot(@RequestBody Project project) throws JsonProcessingException {
        return contractProjectAnalysisService.getProjectContractAnalysisWithProjectAsRoot(project);
    }

    /**
     * 根据项目ID获取合同数据的原始JSON
     * @param projectId 项目ID
     * @return 合同数据的JSON格式
     * @throws JsonProcessingException JSON处理异常
     */
    @GetMapping("/data")
    public String contractProjectData(@RequestParam("projectId") String projectId) throws JsonProcessingException {
        return contractProjectAnalysisService.getProjectContractDataAsJson(projectId);
    }

    /**
     * 根据项目ID获取合同数据的中文字段名JSON（以项目作为最外层结构）
     * @param projectId 项目ID
     * @return 合同数据的中文字段名JSON格式
     * @throws JsonProcessingException JSON处理异常
     */
    @GetMapping("/chinese-data")
    public String contractProjectChineseData(@RequestParam("projectId") String projectId) throws JsonProcessingException {
        // 使用新的方法直接返回以项目为根结构的中文JSON数据
        return contractProjectAnalysisService.getProjectContractDataAsChineseJsonDirect(projectId);
    }
    
    /**
     * 根据项目对象获取合同数据的原始JSON
     * @param projectDTO 项目对象
     * @return 合同数据的JSON格式
     * @throws JsonProcessingException JSON处理异常
     */
    @PostMapping("/data-by-object")
    public String contractProjectDataByObject(@RequestBody ProjectDTO projectDTO) throws JsonProcessingException {
        return contractProjectAnalysisService.getProjectContractDataAsJson(projectDTO);
    }

    /**
     * 根据项目对象获取合同数据的中文字段名JSON
     * @param projectDTO 项目对象
     * @return 合同数据的中文字段名JSON格式
     * @throws JsonProcessingException JSON处理异常
     */
    @PostMapping("/chinese-data-by-object")
    public String contractProjectChineseDataByObject(@RequestBody ProjectDTO projectDTO) throws JsonProcessingException {
        return contractProjectAnalysisService.getProjectContractDataAsChineseJson(projectDTO);
    }
    
    /**
     * 根据项目对象获取合同数据的原始JSON（以项目作为最外层结构）
     * @param project 项目对象
     * @return 合同数据的JSON格式
     * @throws JsonProcessingException JSON处理异常
     */
    @PostMapping("/data-with-project-as-root")
    public String contractProjectDataWithProjectAsRoot(@RequestBody Project project) throws JsonProcessingException {
        return contractProjectAnalysisService.getProjectContractDataAsJsonWithProjectAsRoot(project);
    }

    /**
     * 根据项目对象获取合同数据的中文字段名JSON（以项目作为最外层结构）
     * @param project 项目对象
     * @return 合同数据的中文字段名JSON格式
     * @throws JsonProcessingException JSON处理异常
     */
    @PostMapping("/chinese-data-with-project-as-root")
    public String contractProjectChineseDataWithProjectAsRoot(@RequestBody Project project) throws JsonProcessingException {
        return contractProjectAnalysisService.getProjectContractDataAsChineseJsonWithProjectAsRoot(project);
    }
}